#ifndef __EV_SEC_ISL_SN_DATA_H__
#define __EV_SEC_ISL_SN_DATA_H__


#include<stdint.h>
#include<string>
#include<vector>
#include"EvSecIslSNDataSub.hpp"


namespace SC_SUN
{

struct EvSecIslSNData
{

//////星间信息汇总//////
double ST_TT;                                       ///< 总时长
double SEC_STP;                                     ///< 星间信息切片步长
uint64_t SEC_NUM;                                   ///< 星间信息切片数量

//////切片信息及存储地址//////
/*
长度：5位
范围：1-SEC_NUM
格式：SEC+XXXXX
【SEC0000*】
【SEC000**】
【SEC00***】
【SEC0****】
【SEC*****】
*/
std::string SEC_SN;                                 ///< 星间信息切片序号
double SEC_ST;                                      ///< 星间信息切片仿真时
uint64_t SEC_ISL_NUM;                               ///< 该切片星间链路数量
std::string PATH_SEC_SN;                            ///< 切片文件夹地址和文件夹名

//////链路信息及存储地址//////
/*
长度：6位
范围：1-SEC_ISL_NUM
格式：SEC_ISL+XXXXXX
【SEC_ISL00000*】
【SEC_ISL0000**】
【SEC_ISL000***】
【SEC_ISL00****】
【SEC_ISL0****】
【SEC_ISL******】
*/
std::string SEC_ISL_SN;                             ///< 星间链路序号
std::string SEC_ISL_SAT1;                           ///< 星间链路终端卫星1
std::string SEC_ISL_SAT2;                           ///< 星间链路终端卫星2
std::string PATH_SEC_ISL_SN;                        ///< 链路文件地址和文件名
EvSecIslSNDataSub SEC_ISL_SN_SUB;

void ObjToJsonObject(rapidjson::Document& doc)
{
    using namespace rapidjson;

    doc.AddMember(Value("ST_TT", doc.GetAllocator()), Value(ST_TT), doc.GetAllocator());
    doc.AddMember(Value("SEC_STP", doc.GetAllocator()), Value(SEC_STP), doc.GetAllocator());
    doc.AddMember(Value("SEC_NUM", doc.GetAllocator()), Value(SEC_NUM), doc.GetAllocator());

    doc.AddMember(Value("SEC_SN", doc.GetAllocator()), Value(SEC_SN.data(), doc.GetAllocator()), doc.GetAllocator());
    doc.AddMember(Value("SEC_ST", doc.GetAllocator()), Value(SEC_ST), doc.GetAllocator());
    doc.AddMember(Value("SEC_ISL_NUM", doc.GetAllocator()), Value(SEC_ISL_NUM), doc.GetAllocator());
    doc.AddMember(Value("PATH_SEC_SN", doc.GetAllocator()), Value(PATH_SEC_SN.data(), doc.GetAllocator()), doc.GetAllocator());

    doc.AddMember(Value("SEC_ISL_SN", doc.GetAllocator()), Value(SEC_ISL_SN.data(), doc.GetAllocator()), doc.GetAllocator());
    doc.AddMember(Value("SEC_ISL_SAT1", doc.GetAllocator()), Value(SEC_ISL_SAT1.data(), doc.GetAllocator()), doc.GetAllocator());
    doc.AddMember(Value("SEC_ISL_SAT2", doc.GetAllocator()), Value(SEC_ISL_SAT2.data(), doc.GetAllocator()), doc.GetAllocator());
    doc.AddMember(Value("PATH_SEC_ISL_SN", doc.GetAllocator()), Value(PATH_SEC_ISL_SN.data(), doc.GetAllocator()), doc.GetAllocator());

    doc.AddMember(Value("SEC_ISL_SN_SUB", doc.GetAllocator()), SEC_ISL_SN_SUB.ObjToJsonObject(doc), doc.GetAllocator());
}


static EvSecIslSNData JsonObjectToObject(rapidjson::GenericObject<true, rapidjson::Value> obj)
{
    using namespace rapidjson;

    EvSecIslSNData ret;

    ret.ST_TT = obj["ST_TT"].GetDouble();
    ret.SEC_STP = obj["SEC_STP"].GetDouble();
    ret.SEC_NUM = obj["SEC_NUM"].GetUint64();

    ret.SEC_SN = obj["SEC_SN"].GetString();
    ret.SEC_ST = obj["SEC_ST"].GetDouble();
    ret.SEC_ISL_NUM = obj["SEC_ISL_NUM"].GetUint64();
    ret.PATH_SEC_SN = obj["PATH_SEC_SN"].GetString();

    ret.SEC_ISL_SN = obj["SEC_ISL_SN"].GetString();
    ret.SEC_ISL_SAT1 = obj["SEC_ISL_SAT1"].GetString();
    ret.SEC_ISL_SAT2 = obj["SEC_ISL_SAT2"].GetString();
    ret.PATH_SEC_ISL_SN = obj["PATH_SEC_ISL_SN"].GetString();

    ret.SEC_ISL_SN_SUB = EvSecIslSNDataSub::JsonObjectToObject(obj);

    return ret;
}


static EvSecIslSNData JsonObjectToObject2(rapidjson::Document& doc)
{
    using namespace rapidjson;

    EvSecIslSNData ret;
    auto obj = doc.GetObj();

    ret.ST_TT = obj["ST_TT"].GetDouble();
    ret.SEC_STP = obj["SEC_STP"].GetDouble();
    ret.SEC_NUM = obj["SEC_NUM"].GetUint64();

    ret.SEC_SN = obj["SEC_SN"].GetString();
    ret.SEC_ST = obj["SEC_ST"].GetDouble();
    ret.SEC_ISL_NUM = obj["SEC_ISL_NUM"].GetUint64();
    ret.PATH_SEC_SN = obj["PATH_SEC_SN"].GetString();

    ret.SEC_ISL_SN = obj["SEC_ISL_SN"].GetString();
    ret.SEC_ISL_SAT1 = obj["SEC_ISL_SAT1"].GetString();
    ret.SEC_ISL_SAT2 = obj["SEC_ISL_SAT2"].GetString();
    ret.PATH_SEC_ISL_SN = obj["PATH_SEC_ISL_SN"].GetString();

    ret.SEC_ISL_SN_SUB = EvSecIslSNDataSub::JsonObjectToObject2(obj);

    return ret;
}

};


}

#endif